跳到主要内容

JZ59 按之字形顺序打印二叉树

https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0

import java.util.ArrayList;
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
// 注意:这题是之字型,所以每次遍历完一层都需要逆序
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
boolean reverse = false;
while (!queue.isEmpty()) {
// 注意这个要保存下来,否则会因为 remove 或 add 而变动
int length = queue.size();
// 这里的原理就是
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
TreeNode node = queue.remove();
if (reverse) {
list.add(0, node.val); //每次加到0的位置,就自动逆序了
} else {
list.add(node.val);
}
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
result.add(list);
reverse = !reverse;
}

return result;
}

}

这题牛客上标为简单就离谱,中等题属于是。话说回来,这题在 for 循环之前先提前记录一层里面有多少个节点,然后再把这一层的全部节点入队,所以每次大 while 循环结束后,表示当前层的节点已经全部入队了。

然后之字型,只需切换头插、尾插就行了